package com.rocksdata.mc.business;


import android.app.Activity;
import android.content.Context;

import com.rocksdata.mc.entity.AnnouncementInfo;
import com.rocksdata.mc.entity.CampusAppInfo;
import com.rocksdata.mc.entity.CourseInfo;
import com.rocksdata.mc.entity.StudentContactInfo;
import com.rocksdata.mc.entity.StudentInfo;
import com.rocksdata.mc.entity.TeacherInfo;
import com.rocksdata.mc.entity.TeacherContactInfo;
import com.rocksdata.mc.entity.VersionInfo;

import org.xutils.common.Callback;

import java.io.File;
import java.util.List;

public interface BusinessInterface {
	/**
	 * 业务接口回调监听器
	 */
	interface OnBusinessResultListener {
		/**
		 * 业务接口结果回调
		 * 
		 * @param isSuccess 是否成功
		 * @param object 业务对象
		 * @param message 提示信息
		 */
		void onBusinessResult(boolean isSuccess, Object object, String message);
	}

	/**
	 * 账户管理
	 */
	interface IAccountManager {

		/**
		 * 登录
		 *
         * @param context 界面上下文，用于7.0后申请权限
		 * @param account 账号
		 * @param password 密码
		 * @param listener 回调
		 */
		void login(Activity context, String account, String password, OnBusinessResultListener listener);

		/**
		 * 退出登录
		 */
		void logout();

        /**
         * 登录成功后的初始化
         */
        void onLoginSuccess();

        /**
         * 修改密码
         */
        void modifyPassword(String oldPassword, String newPassword, OnBusinessResultListener listener);

        /**
         *上传头像
         * @param picturePath
         */
        void uploadAvatar(String picturePath, OnBusinessResultListener listener);

        /**
         * 问题反馈
         * @param content
         * @param contact
         * @param image
         * @param listener
         */
        void feedback(String content, String contact, File image, OnBusinessResultListener listener);
    }

    /**
     * 用户管理
     */
	interface IUserInfoManager{
        /**
         * 缓存获取学生信息
         *
         * @param userId 用户id
         * @return 学生信息
         */
		StudentInfo getStudentInfoLocal(String userId);

        /**
         * 接口获取学生信息
         *
         * @param userId 用户id
         * @param listener 回调
         */
        void getStudentInfoRemote(String userId, OnBusinessResultListener listener);

        /**
         * 缓存获取教师信息
         *
         * @param userId 用户id
         * @return 教师信息
         */
        TeacherInfo getTeacherInfoLocal(String userId);

        /**
         * 接口获取教师信息
         *
         * @param userId 用户id
         * @param listener 回调
         */
        void getTeacherInfoRemote(String userId, OnBusinessResultListener listener);

        /**
         * 缓存获取学生通讯录列表，列表为班级-学生的二级树形结构
         *
         * @return 学生通讯录列表
         */
        List<StudentContactInfo> getStudentList();

        /**
         * 接口获取学生通讯录列表，列表为班级-学生的二级树形结构
         *
         * @param listener 回调
         */
        void getStudentListRemote(OnBusinessResultListener listener);

        /**
         * 缓存获取教师通讯录列表，列表为部门-教师的二级树形结构
         *
         * @return 教师通讯录列表
         */
        List<TeacherContactInfo> getTeacherList();

        /**
         * 接口获取教师通讯录列表，列表为部门-教师的二级树形结构
         *
         * @param listener 回调
         */
        void getTeacherListRemote(OnBusinessResultListener listener);

        /**
         * 缓存获取班级中学生列表
         *
         * @param classCode 班级编码
         * @return 学生列表
         */
        List<StudentInfo> getStudentListByClassNum(String classCode);
    }

    /**
     * 推送管理
     */
	interface IPushManager {
        /**
         * 推送服务初始化
         */
		void initPushService();

        /**
         * 绑定推送关联
         */
		void bindPushRelation();

        /**
         * 解绑推送关联
         */
		void unbindPushRelation();
	}

    /**
     * 版本管理
     */
	interface IVersionManager {
        /**
         * 获取最新版本信息
         *
         * @param listener 回调
         */
	    void getLatestVersionInfo (OnBusinessResultListener listener);


        /**
         * 升级版本，当版本对应的本地文件存在则安装，不存在则下载安装
         *
         * @param context 上下文
         * @param info 版本信息
         * @param callback 下载回调
         */
	    void updateVersion(Context context, VersionInfo info, Callback.ProgressCallback<File> callback);
    }

    /**
     * 通知公告管理
     */
    interface IAnnouncementManager {

        /**
         * 接口获取通知公告列表
         *
         * @param pageIndex 页数
         * @param type 通知公告类型，0通知，1公告，null按时间倒序的所有
         * @param lastDate 最新一条记录的时间
         * @param listener 回调
         */
        void getAnnouncementListRemote(int pageIndex, Integer type, String lastDate, BusinessInterface.OnBusinessResultListener listener);

        /**
         * 设置已读
         *
         * @param announcementId 通知公告id
         */
        void setRead(String announcementId);

        /**
         * 设置置顶
         *
         * @param announcementId 通知公告id
         */
        void setToTop(String announcementId);

        /**
         * 设置未读标记
         *
         * @param list 通知公告列表
         */
        void setReadFlag(List<AnnouncementInfo> list);


        /**
         * 对通知公告列表排序，优先置顶，然后时间倒序
         *
         * @param list 通知公告列表
         */
        void sortList(List<AnnouncementInfo> list);
    }

    /**
     * 新闻管理
     */
    interface INewsManager {
        /**
         * 获取新闻标签
         *
         * @param listener 回调
         */
        void getNewsTags(BusinessInterface.OnBusinessResultListener listener);

        /**
         * 获取新闻列表
         *
         * @param tagId 标签id
         * @param pageIndex 页数
         * @param listener 回调
         */
        void getNewsListByTag(String tagId, int pageIndex, BusinessInterface.OnBusinessResultListener listener);
    }

    /**
     * 移动OA管理
     */
    interface IOAManager {
        /**
         * 获取待办消息列表
         *
         * @param pageIndex 页数
         * @param listener 回调
         */
        void getUntreatedOAList(int pageIndex, BusinessInterface.OnBusinessResultListener listener);

        /**
         * 获取已办消息列表
         *
         * @param pageIndex 页数
         * @param listener 回调
         */
        void getTreatedOAList(int pageIndex, BusinessInterface.OnBusinessResultListener listener);

        /**
         * 获取我的申请列表
         *
         * @param pageIndex 页数
         * @param listener 回调
         */
        void getMyOAApplyList(int pageIndex, BusinessInterface.OnBusinessResultListener listener);

        /**
         * 删除我的申请
         *
         * @param id 业务id
         * @param listener 回调
         */
        void deleteOAApply(String id, BusinessInterface.OnBusinessResultListener listener);
    }

    /**
     * 课表管理
     */
    interface ITimetableManager {
        /**
         * 接口获取周课表
         *
         * @param listener 回调
         */
        void getWeekTimetable(BusinessInterface.OnBusinessResultListener listener);

        /**
         * 发布预习
         *
         * @param info 课程信息
         * @param content 预习内容
         * @param listener 回调
         */
        void releasePreview(CourseInfo info, String content, BusinessInterface.OnBusinessResultListener listener);

        /**
         * 接口获取预习内容
         *
         * @param info 课程信息
         * @param listener 回调
         */
        void getPreview(CourseInfo info, final BusinessInterface.OnBusinessResultListener listener);

        /**
         * 发布作业
         *
         * @param info 课程信息
         * @param content 作业内容
         * @param listener 回调
         */
        void releaseHomework(CourseInfo info, String content, final BusinessInterface.OnBusinessResultListener listener);

        /**
         * 接口获取作业内容
         *
         * @param info 课程信息
         * @param listener 回调
         */
        void getHomework(CourseInfo info, final BusinessInterface.OnBusinessResultListener listener);
    }

    /**
     * 校园应用管理
     */
    interface ICampusAppManager {
        /**
         * 接口获取应用列表
         *
         * @param listener 回调
         */
        void syncAppList(OnBusinessResultListener listener);

        /**
         * 本地获取所有应用列表
         *
         * @return 应用列表
         */
        List<CampusAppInfo> getAllAppList();

        /**
         * 本地获取首页应用
         *
         * @return 应用列表
         */
        List<CampusAppInfo> getHomepageApps();

        /**
         * 本地获取手势密码应用
         *
         * @return 应用列表
         */
        List<CampusAppInfo> getGesturePasswordApps();
    }

    /**
     * 工资单管理
     */
    interface IPayrollManager {
        /**
         * 获取工资单信息，先缓存获取，返回空时接口获取
         *
         * @param yearMonth 年月
         * @param payrollClass 工资单的结构数据类
         * @param listener 回调
         */
        void getPayrollInfo(String yearMonth, Class payrollClass, BusinessInterface.OnBusinessResultListener listener);
    }
}
